/*
网络工具类 源文件
*/
#include "com_network_tool.h"

// 网络灯 NETLIGHT，全局定义
CM_GPIO_Handle_t netlight = {
    .gpio_num = CM_GPIO_NUM_4,
    .pin = CM_IOMUX_PIN_16,
    .func = 1,
    .direction = CM_GPIO_DIRECTION_OUTPUT,
    .pull = CM_GPIO_PULL_UP};

/**
 * @brief 等待模块 PDP 激活
 * @param timeout_s 超时时间（秒）
 * @return 0 成功激活 PDP
 *         -1 超时未激活
 */
int wait_pdp_ready(int timeout_s)
{
    //输出


    int pdp_time_out = 0;
    int max_count = timeout_s * 5; // 每次循环 200ms，所以每秒 5 次

    while (1)
    {
        if (cm_modem_get_pdp_state(1) == 1)
        {
            cm_log_printf(0, "network ready\n");
            return 0; // PDP 激活成功
        }

        if (pdp_time_out >= max_count)
        {
            cm_log_printf(0, "network timeout after %d seconds\n", timeout_s);
            cm_pm_reboot(); // 超时重启模块
            return -1;      // 超时返回
        }

        osDelay(200); // 延时 200ms
        pdp_time_out++;
    }

    /* 适当等待（模组PDP激活到能进行数据通信需要适当等待，或者通过PING操作确定模组数据通信是否可用） */
    osDelay(1000);
    return 0;
}

/**
 * @brief 初始化网络灯并根据PDP激活状态控制其亮灭
 *
 * 函数流程：
 * 1. 初始化网络灯GPIO配置
 * 2. 等待模块PDP激活（超时时间10秒）
 * 3. 根据激活结果控制网络灯状态：激活成功则点亮，失败则熄灭
 *
 *
 * @return int 执行结果：0表示成功（含激活成功/失败但流程完成），-1表示GPIO初始化失败
 */
int netlight_init_and_control(void)
{


    // 初始化网络灯GPIO（配置为输出模式等底层操作）
    if (cm_gpio_init_tool(&netlight) != 0)
    {
        cm_log_printf(0, "netlight GPIO initialization failed!\n");
        return -1;
    }

    // 等待PDP激活（超时时间10秒）
    cm_log_printf(0, "Waiting for PDP activation (timeout 10s)...\n");
    int ret = wait_pdp_ready(10);

    if (ret == -1)
    {
        // PDP激活失败：熄灭网络灯并记录日志
        cm_log_printf(0, "PDP activation failed! Turn off netlight.\n");
        cm_gpio_write(&netlight, NETLIGHT_OFF);
    }
    else
    {
        // PDP激活成功：点亮网络灯并记录日志
        cm_log_printf(0, "PDP activation success! Turn on netlight.\n");
        cm_gpio_write(&netlight, NETLIGHT_ON);
    }

    // 无论激活成功与否，函数流程正常完成
    return 0;
}